package chaoyue.study.pool;

import chaoyue.study.ThreadUtils;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 使用 Executors可以快速创建线程池
 * 但本质上也是使用的ThreadPoolExecutor进行创建，不过是加了一些预设参数而已
 */
public class ThreadPoolTest1 {
    public static void main(String[] args) throws Exception {
        CountDownLatch countDownLatch = new CountDownLatch(10);
        // 可缓存的线程池，核心线程数为0（有点像队列的作用），队列大小没有限制
        //ExecutorService pool = Executors.newCachedThreadPool();

        // 只有一个线程的线程池，可以保证任务的顺序执行，队列大小没有限制
        //ExecutorService pool = Executors.newSingleThreadExecutor();

        // 固定数量的线程池，核心线程数和最大线程数相同，队列大小没有限制
        // ExecutorService pool = Executors.newFixedThreadPool(2);

        // 采用工作窃取的线程池，每个工作线程都有一个自己的双端队列用于存储任务，当自己的队列为空时，可以从其他工作线程的队列中获取任务进行执行
        // 基于ForkJoinPool实现
        ExecutorService pool = Executors.newWorkStealingPool(2);
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            pool.submit(() -> {
                ThreadUtils.sleepRandom(2000);
                System.out.println(Thread.currentThread().getName() + ":task-" + taskId);
                countDownLatch.countDown();
            });
        }

        countDownLatch.await();
        System.out.println("all task end...");
    }
}
